<?php

require_once 'BancoDeDados.php';
require_once 'Procedencia.php';
require_once 'Objeto.php';

class Aquisicao {

    private $cod_aquisicao;
    private $descricao;
    private $entidade_pessoa;
    private $procedencia;
    private $objeto;
    private $vinculado;

    public function setCod_aquisicao(&$cod_aquisicao) {
        $this->cod_aquisicao = &$cod_aquisicao;
    }

    public function &getCod_aquisicao() {
        return $this->cod_aquisicao;
    }

    public function setDescricao(&$descricao) {
        $this->descricao = &$descricao;
    }

    public function &getDescricao() {
        return $this->descricao;
    }

    public function setEntidade_pessoa(&$entidade_pessoasoa) {
        $this->entidade_pessoa = &$entidade_pessoasoa;
    }

    public function &getEntidade_pessoa() {
        return $this->entidade_pessoa;
    }

    public function &isVinculado() {
        return $this->vinculado;
    }

    private function setVinculado(&$vinculado) {
        $this->vinculado = &$vinculado;
    }

    /**
     *
     * @return Procedencia
     */
    public function &getProcedencia() {
        return $this->procedencia;
    }

    public function setProcedencia(Procedencia &$procedencia) {
        $this->procedencia = &$procedencia;
    }

    /**
     *
     * @return Objeto
     */
    public function &getObjeto() {
        return $this->objeto;
    }

    public function setObjeto(Objeto &$objeto) {
        $this->objeto = &$objeto;
    }

    public function cadastrar() {
        if ($this->validar() != 1) {
            throw new Exception("Aquisição existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into aquisicao(descricao, entidade_pessoa) values(?,?)');
        $result = $link->execute($stmt, array($this->descricao, $this->entidade_pessoa));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'descricao' && $this->descricao != $campo_valor) {
            $temp = &$this->descricao;
            $this->descricao = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Aquisição existente |".$temp);
            }
        } else if ($campo_id == 'entidade_pessoa' && $this->entidade_pessoa != $campo_valor) {
            $temp = &$this->entidade_pessoa;
            $this->entidade_pessoa = &$campo_valor;
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update aquisicao set ' . $campo_id . ' = ? where cod_aquisicao = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_aquisicao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage()." |".$temp);
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from aquisicao where cod_aquisicao = ?');
        $result = $link->execute($stmt, array($this->cod_aquisicao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public static function &listar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from aquisicao order by cod_aquisicao');
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $aquisicao = new Aquisicao();
            $aquisicao->setCod_aquisicao($row['cod_aquisicao']);
            $aquisicao->setDescricao($row['descricao']);
            $aquisicao->setEntidade_pessoa($row['entidade_pessoa']);
            $aquisicao->setVinculado($aquisicao->verificarVinculacao());
            $resultado[] = &$aquisicao;
            unset($aquisicao);
        }
        return $resultado;
    }

    public static function &consultarPorObjeto(Objeto &$objeto) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select aquisicao.cod_aquisicao, descricao, entidade_pessoa, cod_procedencia from aquisicao, objeto_aquisicao where aquisicao.cod_aquisicao = objeto_aquisicao.cod_aquisicao and cod_interno = ?', array($objeto->getCod_interno()));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() == 0) {
            throw new Exception("Aquisição inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de um Aquisição com o mesmo identificador, informe ao administrador");
        }
        $result->fetchInto($row);
        $aquisicao = new Aquisicao();
        $aquisicao->setCod_aquisicao($row['cod_aquisicao']);
        $aquisicao->setDescricao($row['descricao']);
        $aquisicao->setEntidade_pessoa($row['entidade_pessoa']);
        $aquisicao->setProcedencia(Procedencia::consultar($row['cod_procedencia']));
        $aquisicao->setObjeto($objeto);
        return $aquisicao;
    }

    public static function &consultar($cod_aquisicao) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_aquisicao, descricao, entidade_pessoa from aquisicao where cod_aquisicao = ?', array($cod_aquisicao));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() == 0) {
            throw new Exception("Aquisição inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de um Aquisição com o mesmo identificador, informe ao administrador");
        }
        $result->fetchInto($row);
        $aquisicao = new Aquisicao();
        $aquisicao->setCod_aquisicao($row['cod_aquisicao']);
        $aquisicao->setDescricao($row['descricao']);
        $aquisicao->setEntidade_pessoa($row['entidade_pessoa']);
        return $aquisicao;
    }

    private function &validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_aquisicao from aquisicao where descricao = ?', array($this->descricao));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = 1;
        if ($result->numRows() > 0) {
            $resultado = 0;
        }
        return $resultado;
    }

    private function &verificarVinculacao() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_aquisicao from objeto_aquisicao where cod_aquisicao = ?', array($this->cod_aquisicao));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = 0;
        if ($result->numRows() > 0) {
            $resultado = 1;
        }
        return $resultado;
    }

    public function cadastrarObjeto() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_aquisicao from objeto_aquisicao where cod_aquisicao = ? and cod_interno = ?', array($this->cod_aquisicao, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            throw new Exception('Aquisição existente');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into objeto_aquisicao (cod_interno, cod_aquisicao, cod_procedencia) values(?,?,?)');
        $result = $link->execute($stmt, array($this->objeto->getCod_interno(), $this->cod_aquisicao, $this->procedencia->getCod_procedencia()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function alterarObjeto(&$campo_id, Procedencia &$campo_valor) {
        if ($campo_id == 'cod_procedencia' && $this->procedencia->getCod_procedencia() != $campo_valor->getCod_procedencia()) {
            $this->procedencia = &$campo_valor;
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update objeto_aquisicao set ' . $campo_id . ' = ? where cod_aquisicao = ? and cod_interno = ?');
        $result = $link->execute($stmt, array($campo_valor->getCod_procedencia(), $this->cod_aquisicao, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function excluirObjeto() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from objeto_aquisicao where cod_aquisicao = ? and cod_interno = ?');
        $result = $link->execute($stmt, array($this->cod_aquisicao, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

}
?>